/**
 * 
 */
package com.lafengmaker.core.util;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MD5Util{
	protected static char hexDigits[] = { '0', '1','2', '3', '4', '5', '6', '7', '8', '9','a', 'b', 'c', 'd', 'e', 'f'};
	protected static MessageDigest messagedigest = null;
	static{
		   try{
		   messagedigest = MessageDigest.getInstance("MD5");
		  }catch(NoSuchAlgorithmException nsaex ){
		   System.err.println(MD5Util.class.getName()+"初始化失败，MessageDigest不支持MD5Util。");
		   nsaex.printStackTrace();
		   }
		}
	public  static String getMD5Str(String str) {  
        MessageDigest messageDigest = null;  
        try {  
            messageDigest = MessageDigest.getInstance("MD5");  
            messageDigest.reset();  
            messageDigest.update(str.getBytes("UTF-8"));  
        } catch (NoSuchAlgorithmException e) {  
            System.out.println("NoSuchAlgorithmException caught!");  
            System.exit(-1);  
        } catch (UnsupportedEncodingException e) {  
            e.printStackTrace();  
        }  
        byte[] byteArray = messageDigest.digest();  
        StringBuffer md5StrBuff = new StringBuffer();  
        for (int i = 0; i < byteArray.length; i++) {              
            if (Integer.toHexString(0xFF & byteArray[i]).length() == 1)  
                md5StrBuff.append("0").append(Integer.toHexString(0xFF & byteArray[i]));  
            else  
                md5StrBuff.append(Integer.toHexString(0xFF & byteArray[i]));  
        }  
        return md5StrBuff.toString();  
    }
	public static String getFileMD5String(File file) throws IOException{
		   FileInputStream in = new FileInputStream(file);
		   FileChannel ch =in.getChannel();
		   MappedByteBuffer byteBuffer =ch.map(FileChannel.MapMode.READ_ONLY, 0, file.length());
		  messagedigest.update(byteBuffer);
		   return bufferToHex(messagedigest.digest());
	}
	public static String getStreamHash(InputStream stream)  
    {  
        String hash=null;  
        byte[] buffer = new byte[1024];  
        BufferedInputStream in=null;  
        try  
        {  
            in=new BufferedInputStream(stream);  
            int numRead = 0;    
            while ((numRead = in.read(buffer)) > 0)   
            {    
            	messagedigest.update(buffer, 0, numRead);    
            }    
            in.close();   
            hash=bufferToHex(messagedigest.digest());    
        }catch (Exception e)   
        {  
            if(in!=null)try{in.close();}catch (Exception ex) {ex.printStackTrace();}  
            e.printStackTrace();  
        }  
        return hash;  
    }  
	public static String getMD5String(String s){
		   return getMD5String(s.getBytes());
		}
		public static String getMD5String(byte[] bytes){
		  messagedigest.update(bytes);
		   return bufferToHex(messagedigest.digest());
		}
		private static String bufferToHex(byte bytes[]){
		   return bufferToHex(bytes, 0,bytes.length);
		}
		private static String bufferToHex(byte bytes[], int m, int n){
		   StringBuffer stringbuffer =new StringBuffer(2 * n);
		   int k = m + n;
		   for (int l = m; l< k; l++) {
		   appendHexPair(bytes[l], stringbuffer);
		   }
		   return stringbuffer.toString();
		}

		private static void appendHexPair(byte bt, StringBuffer stringbuffer) {
		   char c0 = hexDigits[(bt& 0xf0) >> 4];
		   char c1 = hexDigits[bt& 0xf];
		   stringbuffer.append(c0);
		   stringbuffer.append(c1);
		}
		public static boolean checkPassword(String password, String md5PwdStr) {
		   String s =getMD5String(password);
		   return s.equals(md5PwdStr);
		}
}